AWS Glue ETLライブラリを使ってローカルでSparkを動かす
AWS Glueでは、公式から提供されているライブラリを利用して、GlueジョブのスクリプトをローカルPCで開発することができます。 これを利用して、ローカルでSparkを動かしてみます。
個人的趣味で言語はScalaにしています。Pythonを使いたい場合は下記の記事が参考になります。
準備
AWS Glueの公式ドキュメントを参考に環境を構築します。
ライブラリのダウンロード
まずはMavenとSparkをダウンロードして展開します。今回はGlueバージョン1.0を使用します。
$ curl -O https://aws-glue-etl-artifacts.s3.amazonaws.com/glue-common/apache-maven-3.6.0-bin.tar.gz $ tar zxvf apache-maven-3.6.0-bin.tar.gz -C /path/to/maven $ curl -O https://aws-glue-etl-artifacts.s3.amazonaws.com/glue-1.0/spark-2.4.3-bin-hadoop2.8.tgz $ tar zxvf spark-2.4.3-bin-hadoop2.8.tgz -C /path/to/spark
環境変数を設定します。PATH
はMavenとSparkの両方の配下に通しておきます。
$ export SPARK_HOME=/path/to/spark/spark-2.4.3-bin-spark-2.4.3-bin-hadoop2.8 $ export PATH=/path/to/maven/apache-maven-3.6.0/bin:$SPARK_HOME/bin:$PATH
pom.xmlの作成
公式ドキュメントに載っているpom.xmlをコピーして足元に保存します。今回はGlueバージョン1.0を使用するので、AWSGlueETLのバージョン( Glue version と書いてあるところ)は1.0.0に変更します。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.amazonaws</groupId> <artifactId>AWSGlueApp</artifactId> <version>1.0-SNAPSHOT</version> <name>${project.artifactId}</name> <description>AWS Glue ETL application</description> <properties> <scala.version>2.11.1</scala.version> </properties> <dependencies> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>${scala.version}</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>AWSGlueETL</artifactId> <version>1.0.0</version> </dependency> </dependencies> ...(以下略)
※バージョンを1.0.0にしたpom.xml全体をこちらに置いてあります。
Spark shellを動かしてみる
ダウンロードしたSparkのライブラリにはspark-shellが入っていますので、そのまま起動することができます。
$ spark-shell 20/01/21 19:27:44 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). Spark context Web UI available at http://192.168.10.108:4040 Spark context available as 'sc' (master = local[*], app id = local-1579602475404). Spark session available as 'spark'. Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /___/ .__/\_,_/_/ /_/\_\ version 2.4.3 /_/ Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_191) Type in expressions to have them evaluated. Type :help for more information. scala>
簡単な処理を書いてみます。以下のように動作します。
scala> val rdd = sc.parallelize(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:24 scala> rdd.reduce(_ + _) res0: Int = 55
ビルドして実行してみる
Mavenでビルド、実行することもできます。ソースコードはScalaの標準的なパスに従ってsrc/main/scala/
に置きます。
import org.apache.spark.SparkContext object SparkSample { def main(args: Array[String]): Unit = { val sc = new SparkContext("local", "example") val data = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) val rdd = sc.parallelize(data) val sum = rdd.reduce(_ + _) println(s"sum=$sum") sc.stop() } }
以下のようにビルド、実行します。-Dexec.mainClass
で実行するコードのクラス名を指定します。
$ mvn package $ mvn exec:java -Dexec.mainClass="SparkSample" -Dexec.args="--JOB-NAME SparkSample"
まとめ
AWS Glueで提供されているライブラリを使ってローカルでSparkを動かしてみました。 個人的にAWS Glueを使いたいけどそもそもSparkが分からん、という状態だったのでやってみましたが、意外とすんなり動きました。
なお、試したソースコード全体は以下に置いてあります。